package com.cskaoyan.javase.exception._1handle._1catch;

/**
 * @description: 多分支的try...catch
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import javax.xml.stream.FactoryConfigurationError;

/**
 * 多分支的try...catch非常类似于多分支的if...else
 * 具有多个catch的try...catch结构可以同时处理多种不同类型的异常
 * 语法:
 *      try {
 *          //可能出现异常的，正常的代码逻辑
 *      } catch(要捕捉的异常对象1) {
 *          //每一个catch分支对应一个异常处理器
 *          //在catch分支中处理具体类型的代码异常
 *      }catch(要捕捉的异常对象2) {
 *          //每一个catch分支对应一个异常处理器
 *          //在catch分支中处理具体类型的代码异常
 *      }
 *      ....
 * 这种结构比起一个catch处理多个异常,更加灵活,可以分别针对不同异常做出不同的处理
 *
 * 多分支的try...catch的使用:
 *      1.多分支匹配过程是从上到下的,一旦匹配上相应的catch代码块就会被执行,否者就都不执行,相当于没有处理异常
 *      2.如果多个catch中的异常类型具有了父子关系,父类类型的catch应该写在下面,子类类型的catch写在上面
 *          建议可以在最后面写一个Exception的catch分支,作为兜底,接盘的作用,这就相当于多分支if...else里的最后一个else
 *      3.编译时异常如果写在catch中,必须要try中有可能抛出改异常的方法或者对应的代码
 */
public class Demo2 {
    public static void main(String[] args) {
        Father fs = new Son();
        int[] arr = new int[3];
        try {
            //System.out.println(10 / 0);
            arr = null;
            //System.out.println(arr.length);
            Son2 s = (Son2) fs;
            Demo2 d = new Demo2();
            d.clone();
        } catch (ArithmeticException e) {
            e.printStackTrace();
            System.out.println("hello 算术异常");
        } catch (NullPointerException e) {
            e.printStackTrace();
            System.out.println("hello 空指针异常");
        } catch (ClassCastException e) {
            e.printStackTrace();
            System.out.println("hello 类型转换异常");
        }//Exception 'java.lang.CloneNotSupportedException' is never thrown in the corresponding try block
        catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        catch (RuntimeException e){
            e.printStackTrace();
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

class Father {
}

class Son extends Father {
}

class Son2 extends Father {
}